﻿using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;

using Moe.ECamel.Common.Contracts;
using Moe.ECamel.Common.Security;
using Moe.ECamel.Server.Services;

namespace Moe.ECamel.AdminConsole
{
	public partial class ECamelSetupForm : Form
	{
		public ECamelSetupForm()
		{
			InitializeComponent();

			this.DatabasePathTextBox.Text = GetDefaultDatabasePath();
		}

		private void CreateDatabaseButton_Click(object sender, EventArgs e)
		{
			var result = MessageBox.Show("פעולה זו תמחק את כל הנתונים במערכת. האם אתה בטוח שאתה רוצה להמשיך?", "מנהל מערכת",
							 MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if (result == DialogResult.No)
				return;

			var originalCursor = this.Cursor;
			this.Cursor = Cursors.WaitCursor;
			try
			{
				ECamelSetupInfo setupInfo = new ECamelSetupInfo
				{
					AdminUsername = AdminUsernameTextBox.Text,
					AdminPassword = ECamelPasswordHasher.ComputeHash(AdminPasswordTextBox.Text),
					DatabasePath = DatabasePathTextBox.Text,
					GenerateDemoData = GenerateDemoDataCheckBox.Checked
				};

				using (var service = new SystemService())
				{
					service.ResetDatabase(setupInfo);
				}
				MessageBox.Show("אתחול בסיס נתונים הושלם בהצלחה.", "מנהל מערכת", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
			catch (Exception ex)
			{
				MessageBox.Show("שגיאה באתחול בסיס נתונים:" + Environment.NewLine + ex.Message, "מנהל מערכת", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
			finally
			{
				this.Cursor = originalCursor;
			}
		}
		private void DeleteDatabaseButton_Click(object sender, EventArgs e)
		{
			var result = MessageBox.Show("פעולה זו תמחק את כל הנתונים במערכת. האם אתה בטוח שאתה רוצה להמשיך?", "מנהל מערכת",
			                             MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if (result == DialogResult.No)
				return;

			var originalCursor = this.Cursor;
			this.Cursor = Cursors.WaitCursor;
			try
			{
				using (var service = new SystemService())
				{
					service.DeleteDatabase();
				}
				MessageBox.Show("בסיס הנתונים נמחק בהצלחה.", "מנהל מערכת", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
			catch (Exception ex)
			{
				MessageBox.Show("שגיאה במחיקת בסיס נתונים:" + Environment.NewLine + ex.Message, "מנהל מערכת", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
			finally
			{
				this.Cursor = originalCursor;
			}
		}

		private void BrowseDatabasePathButton_Click(object sender, EventArgs e)
		{
			using (var dialog = new FolderBrowserDialog())
			{
				dialog.Description = "בחירת מיקום בסיס נתונים";
				dialog.SelectedPath = DatabasePathTextBox.Text;
				dialog.ShowNewFolderButton = true;
				DialogResult result = dialog.ShowDialog();
				if (result == DialogResult.OK)
					DatabasePathTextBox.Text = dialog.SelectedPath;
			}
		}

		private static String GetDefaultDatabasePath()
		{
			String path = Assembly.GetEntryAssembly().Location;
			path = Path.Combine(Path.GetDirectoryName(path), "ECamelDB");
			return path;
		}
	}
}
